package cn.tedu.knows.portal.controller;

import cn.tedu.knows.portal.exception.ServiceException;
import cn.tedu.knows.portal.service.IUserService;
import cn.tedu.knows.portal.vo.RegisterVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.UUID;

@RestController
//lombok提供的注释@SLF4j,能够在当前类中生成一个记录日志的对象
// 我们在本类方法中可以使用这个对象记录日志
@Slf4j
public class SystemController {

    @Autowired
    private IUserService userService;

    @PostMapping("/register")
    public String register(
            // RegisterVO参数前加@Validated注解表示启动SpringValidation
            // 在控制器方法前,框架会按照RegisterVO类中编写的规则对它进行验证
            @Validated RegisterVO registerVO,
            // 下面这个参数是专门接收前面验证的结果用的
            // 我们判断这个result是否有错误信息,来获得验证结果
            BindingResult result) {
        // log 对象就是@Slf4j注解生效提供的,它能够记录日志
        log.debug("接收到表单信息:" + registerVO);
        if (result.hasErrors()){
            // 获得验证结果中的错误信息(多条错误信息随机获取)
            String msg=result.getFieldError().getDefaultMessage();
            return msg;
        }
            userService.registerStudent(registerVO);
            return "ok";
    }
    //从 文件中获取配置资源
    @Value("${knows.resource.path}")
    private File resourcePath;
    @Value("${knows.resource.host}")
    private String resourceHost;
    @PostMapping("/upload/file")
    public String upload(MultipartFile imageFile) throws IOException {
        //确定保存文件的路径
        //确定上传到文件夹,是有日期组成例如 2021/12/03
        // path:2021/12/03
        String path= DateTimeFormatter.ofPattern("yyyy/MM/dd")
                .format(LocalDate.now());
        //实例化要上传的文件夹对象
        //F:/upload/2021/12/03
        File folder=new File(resourcePath,path);
        //创建文件夹
        folder.mkdirs();//mkdirssssssssssssss!!!!!
        //确定随机文件名
        //例如上传文件名为abc.jpg
        //要获得后缀名
        String filename=imageFile.getOriginalFilename();//原始文件名
        //截取后缀名
        String ext=filename.substring(filename.lastIndexOf("."));
        //创建实际文件名
        String name= UUID.randomUUID().toString()+ext;
        //执行上传操作
        //确定要上传的文件对象,其实就是文件夹+文件名
        File file=new File(folder,name);
        //输出实际上传路径
        log.debug("文件上传到:{}",file.getAbsolutePath());
        //执行上传操作
        imageFile.transferTo(file);
        //所谓的回显就是在页面上获得刚刚上传的文件可以在静态资源服务器显示的url
        // 例如 http://localhost:8899/2021/12/03/3ea....d5e4a.jpg
        //           resourceHost   /   path   /  name
        String url=resourceHost+"/"+path+"/"+name;
        log.debug("可显示图片的url:{}",url);
        //返回url 以实现图片的回显
        return url;
    }

}
